home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 283_01 / tm.c < prev    next >
C/C++ Source or Header  |  1988-09-08  |  6KB  |  235 lines

  1.  
  2. /* tm.c -- emulate time and date functions found in C Food Smorgasbord
  3. **         cf_time(p,m), cf_date(p,m) return ptr to '\0' terminator of p
  4. **         caller must provide ptr to storage, and mode
  5. **         these correspond to C.F.S. fns time() and date(), w/ same args
  6. **         
  7. **         February 20, 1988, d.c.oshel
  8. **         for Microsoft C ver. 5.00, and PC/MS-DOS 2.x
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <time.h>
  13. #include <string.h>
  14. #include <dos.h>
  15.  
  16. #define DOS_INT 0x21
  17. #define BCD(Q) (((Q / 10) << 4) | (Q % 10))
  18.  
  19.  
  20.  
  21. char *MON_table[] = {  /* 1..12 */
  22.   NULL,
  23.   "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  24.   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  25. };
  26.  
  27. char *Month_table[] = { /* 1..12 */
  28.   NULL,
  29.   "January", "February", "March", "April", "May", "June",
  30.   "July", "August", "September", "October", "November", "December"
  31. };
  32.  
  33.  
  34. char *Day_table[] = {  /* 1..7 */
  35.     NULL,
  36.     "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
  37.     "Saturday"
  38. };
  39.  
  40.  
  41.  
  42.  
  43. void get_system_time( int *hr, int *min, int *sec, int *hnd )
  44. {
  45.       union REGS tm;
  46.  
  47.       tm.h.ah = 0x2C;  /* DOS get time function */
  48.  
  49.       int86( DOS_INT, &tm, &tm );
  50.  
  51.       *hr  = tm.h.ch;  /* 0..23 */
  52.       *min = tm.h.cl;  /* 0..59 */
  53.       *sec = tm.h.dh;  /* 0..59 */
  54.       *hnd = tm.h.dl;  /* 0..99 */
  55. }
  56.  
  57. void get_system_date( int *year, int *month, int *day, int *dayofweek )
  58. {
  59.       union REGS tm;
  60.  
  61.       tm.h.ah = 0x2A;  /* DOS get date function */
  62.  
  63.       int86( DOS_INT, &tm, &tm );
  64.  
  65.       *year      = tm.x.cx;  /* 1980..2099 */
  66.       *month     = tm.h.dh;  /* 1..12 */
  67.       *day       = tm.h.dl;  /* 1..31 */
  68.       *dayofweek = tm.h.al;  /* 0..6, where 0 is Sunday, 6 is Saturday */
  69. }
  70.  
  71.  
  72. char *cf_time( char *str, int mode )  
  73. /* fn returns pointer to \0 terminator of str */
  74. {
  75.       char *p, *pm;
  76.       int hh, mm, ss, dd;
  77.  
  78.       get_system_time( &hh, &mm, &ss, &dd );
  79.  
  80.       pm = "PM";
  81.       if ( mode > 5 )
  82.       {
  83.         if ( hh < 12 )
  84.         {
  85.              pm = "AM";
  86.         }
  87.         else 
  88.         {
  89.              hh -= 12;
  90.         }
  91.         if ( hh == 0 ) hh = 12;  /* noon or midnight */
  92.       }
  93.  
  94.       switch (mode)
  95.       {
  96.       case 0: 
  97.         p = str;
  98.         *p++ = BCD( hh );
  99.         *p++ = BCD( mm );
  100.         *p++ = BCD( ss );
  101.         *p++ = BCD( dd );
  102.         goto zoo; /* exit pointing to next byte, per definition */
  103.         break;
  104.       case 1:
  105.         sprintf( str, "%02d%02d%02d", hh, mm, ss);
  106.         break;
  107.       case 2:            
  108.         sprintf( str, "%02d:%02d:%02d", hh, mm, ss);
  109.         break;
  110.       case 3:
  111.         sprintf( str, "%02d%02d%02d%02d", hh, mm, ss, dd);
  112.         break;
  113.       case 4:
  114.         sprintf( str, "%02d:%02d:%02d.%02d", hh, mm, ss, dd);
  115.         break;
  116.       case 5:
  117.         sprintf( str, "%02d:%02d", hh, mm);
  118.         break;
  119.       case 6:
  120.         sprintf( str, "%02d:%02d:%02d %s", hh, mm, ss, pm );
  121.         break;
  122.       case 7:
  123.         sprintf( str, "%02d:%02d %s", hh, mm, pm );
  124.         break;
  125.       default:
  126.         p = NULL;
  127.         goto zoo;
  128.       }
  129.  
  130.       p = strrchr( str, '\0' );
  131. zoo:  return (p);
  132. }
  133.  
  134.  
  135. char *cf_date( char *str, int mode ) 
  136. /* fn returns pointer to \0 terminator of str */
  137. {
  138.       char *p; 
  139.       int yr, mo, da, dw;
  140.  
  141.       get_system_date( &yr, &mo, &da, &dw );
  142.  
  143.       switch (mode)
  144.       {
  145.       case 0:
  146.         p = str;
  147.         yr %= 100;
  148.         *p++ = BCD( yr );
  149.         *p++ = BCD( mo );
  150.         *p++ = BCD( da );
  151.         goto zoo;  /* exit pointing to next byte, per definition */
  152.         break;
  153.       case 1:
  154.         sprintf( str, "%02d%02d%02d", (yr % 100), mo, da );
  155.         break;
  156.       case 2:
  157.         sprintf( str, "%02d/%02d/%02d", mo, da, (yr % 100));
  158.         break;
  159.       case 3:
  160.         sprintf( str, "%02d-%02d-%02d", mo, da, (yr % 100));
  161.         break;
  162.       case 4:
  163.         sprintf( str, "%s %02d, %d", MON_table[ mo ], da, yr );
  164.         break;
  165.       case 5:
  166.         /* Smorgasbord would have it as June 01, 1988
  167.            but we have June 1, 1988
  168.            */
  169.         sprintf( str, "%s %d, %d", Month_table[ mo ], da, yr );
  170.         break;
  171.       case 6:
  172.         sprintf( str, "%02d %s %02d", da, MON_table[ mo ], (yr % 100));
  173.         break;
  174.       case 7:
  175.         sprintf( str, "%02d %s %d", da, MON_table[ mo ], yr );
  176.         break;
  177.       default:
  178.         p = NULL;
  179.         goto zoo;
  180.       }
  181.  
  182.       p = strrchr( str, '\0' );
  183. zoo:  return (p);
  184. }
  185.  
  186.  
  187. /* ----- validate the above (works like a charm!) -------------------------
  188. main()
  189. {
  190.    char *p, buf[80];
  191.    int i;
  192.  
  193.    *//* first test ... check bcd options 0 *//*
  194.    cf_date( buf,0 );
  195.    printf("Option 0.  (BCD) Date = (%02x %02x %02x), ", 
  196.            (unsigned)(buf[0] & 0xFF), buf[1], buf[2]);
  197.    cf_time( buf,0 );
  198.    printf("Time = (%02x %02x %02x %02x).\n", 
  199.            buf[0], buf[1], buf[2], (unsigned)(buf[3] & 0xFF));
  200.  
  201.  
  202.    *//* second test ... check options 1..7 *//*
  203.    for ( i = 1; i < 8; i++ )
  204.    {
  205.      p = cf_date( buf,i );
  206.      *p++ = ',';
  207.      *p++ = ' ';
  208.      cf_time( p,i );
  209.      printf("Option %d.  Today is %s.\n", i, buf);
  210.    }
  211.  
  212. }
  213. --------------------------------------------------------------------- */
  214.  
  215. /* return a point to system date string, like "09/10/88" */
  216.  
  217. char *sysdate( void )
  218. {
  219.        static char date[] = "00/00/00";
  220.        cf_date( date, 2 );
  221.        return (date);
  222. }
  223.  
  224.  
  225. /* return a point to system time string, like "09:10:48" (24-hr) */
  226.  
  227. char *systime( void )
  228. {
  229.        static char time[] = "00:00:00";
  230.        cf_time( time, 2 );
  231.        return (time);
  232. }
  233.  
  234.  
  235.